package cn.tedu.mall.seckill.service.impl;

import cn.tedu.mall.pojo.product.vo.SkuStandardVO;
import cn.tedu.mall.pojo.seckill.model.SeckillSku;
import cn.tedu.mall.pojo.seckill.vo.SeckillSkuVO;
import cn.tedu.mall.product.service.seckill.IForSeckillSkuService;
import cn.tedu.mall.seckill.mapper.SeckillSkuMapper;
import cn.tedu.mall.seckill.service.ISeckillSkuService;
import cn.tedu.mall.seckill.utils.SeckillCacheUtils;
import com.alibaba.nacos.client.naming.utils.RandomUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;


@Service
@Slf4j
public class SeckillSkuServiceImpl implements ISeckillSkuService {

    @Autowired
    private SeckillSkuMapper seckillSkuMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @DubboReference
    private IForSeckillSkuService dubboSkuService;

    @Override
    public List<SeckillSkuVO> listSeckillSkus(Long spuId) {
        List<SeckillSku> seckillSkus = seckillSkuMapper.findSeckillSkuBySpuId(spuId);

        List<SeckillSkuVO> seckillSkuVOS = new ArrayList<>();
        for(SeckillSku seckillSku : seckillSkus){
            String seckillSkuVOKey = SeckillCacheUtils.getSeckillSkuVOKey(seckillSku.getSkuId());
            SeckillSkuVO seckillSkuVO;
            if(redisTemplate.hasKey(seckillSkuVOKey)){
                seckillSkuVO = (SeckillSkuVO)redisTemplate.boundValueOps(seckillSkuVOKey).get();
            }else {
                SkuStandardVO skuStandardVO = dubboSkuService.getById(seckillSku.getSkuId());
                // 实例化SeckillSkuVO对象
                seckillSkuVO=new SeckillSkuVO();
                BeanUtils.copyProperties(skuStandardVO,seckillSkuVO);
                // 秒杀信息手动赋值
                seckillSkuVO.setSeckillPrice(seckillSku.getSeckillPrice());
                seckillSkuVO.setStock(seckillSku.getSeckillStock());
                seckillSkuVO.setSeckillLimit(seckillSku.getSeckillLimit());
                // seckillSkuVO保存到Redis
                redisTemplate.boundValueOps(seckillSkuVOKey).set(
                        seckillSkuVO,
                        1000*60*5+ RandomUtils.nextInt(30000),
                        TimeUnit.MILLISECONDS);
            }
            seckillSkuVOS.add(seckillSkuVO);
        }
        return seckillSkuVOS;
    }
}
